import numpy as np
import matplotlib.pyplot as plt


def regressao_linear(x,y):

    n = len(x)

    #somas
    sumX = sum(x)
    sumY = sum(y)

    sumX2 = sum(x**2)
    sumY2 = sum(y**2)
    sumXY = sum(x * y)

    #m , b, r2
    m = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX**2)
    b = (sumX2 * sumY - sumX * sumXY) / (n * sumX2 - sumX**2)
    r2 = (n * sumXY - sumX * sumY)**2 / ((n * sumX2 - sumX**2) * (n * sumY2 - sumY**2))

    #incertezas
    dM = abs(m) * np.sqrt(((1 / r2) - 1) / (n - 2))
    dB = dM * np.sqrt(sumX2 / n)

    return m, b, r2, dM, dB

def grafico_loglog(x,y):       # Gráfico log-log (ambos os eixos em escala logarítmica)
    plt.loglog(x, y,'b-')
    plt.xlabel('temperatura absoluta (T)')
    plt.ylabel('potência (J)')
    plt.title('Ajuste por Regressão Linear em escala Log-Log')
    plt.grid(True, which="both", ls="--")
    plt.show()


def main():
    T = np.array([200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100])
    E = np.array([0.6950, 4.363, 15.53, 38.74, 75.08, 125.2, 257.9, 344.1, 557.4, 690.7])

    #d)potencia para linear
    # log(E) = log(c) + n·log(T)
    logT = np.log(T)
    logE = np.log(E)
    
    
    m, b, r2, dM, dB = regressao_linear(logT, logE) # b = log(c),   m = n
    c = 10 ** b 

    print(f"Equação ajustada (log-log): log(E) = {m:.4f} * log(T) + log{c:.4f}")
    print(f"Coeficiente de determinação r² = {r2:.5f}")
    print(f"Incerteza em m: {dM:.4f}")
    print(f"Incerteza em b: {dB:.4f}")

    # gráfico log-log com linha de regressão ajustada
    # reta ajustada: E = c * T^m
    E_fit = c * T**m 
    grafico_loglog(T, E_fit)


if __name__ == "__main__":
    main()

